\documentclass[a4paper,10pt]{book}

\usepackage[latin1]{inputenc}
\usepackage[italian]{babel}

\title{SpiderpigOS}
\author{Davide Gessa}
\date{21-01-2010}

\pdfinfo{%
  /Title    (SpiderpigOS)
  /Author   (Davide Gessa)
  /Subject  ()
  /Keywords (spiderpig osdev os)
}

\begin{document}
\maketitle

\tableofcontents
\setcounter{tocdepth}{4}
%\listoffigures
\listoftables


\chapter{Introduzione}
SpiderpigOS nasce con l'idea di creare un progetto che permettesse di ampliare
le mie conoscenze informatiche riguardo i processori ed i sistemi operativi, e per
produrre poi un progetto che riguardasse il programma svolto nel triennio dell'indirizzo 
informatica abacus, da poter poi eventualmente presentare all'esame.
Il progetto proseguira' anche successivamente, sara' possibile vederne lo sviluppo sul sito
spiderpig.osdev.it

\section{Lincenza}
Il proggetto e' rilasciato interamente sotto licenza GPLv3, riportata qui di seguito:
\newline
\newline 
\ttfamily
\textit
    SpiderpigOS
    Copyright (C) 2009  Davide Gessa
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.


\rmfamily

\section{Strumenti software}
Ecco una lista dei software principali utilizzati per realizzare il progetto (compilatori, ide, emulatori).
Da sottolineare che tutti sono free software e opensource, e che lo sviluppo e' avvenuto col sistema 
linux gentoo, anch'esso free e open.

\begin{description}
\item[gcc] compilatore linguaggio C
\item[make] sistema per facilitare le compilazioni di piu' file
\item[nasm] compilatore linguaggio assembler
\item[grub] bootloader
\item[qemu] emulatore di computer
\item[bochs] emulatore di computer
\item[geany] C ide
\item[winefish] latex ide 
\item[latex] compilatore \LaTeX
\end{description}



\section{\LaTeX}
Per scrivere la documentazione del sistema e' stato utilizzato il linguaggio di markup
\LaTeX, che permette di preparare dei testi basati su \TeX, un programma di composizione 
tipografica. Utilizzare \LaTeX, permette di risparmiare un tempo notevole per quanto riguarda
la formattazione delle pagine, la creazione degli indici, la visualizzazione di formule matematiche
e molto altro, e per questo motivo e' utilizzato da gran parte di accademici, scienziati, matematici
e ingegneri. \LaTeX e' distribuito come software libero ed e' disponibile su molte piattaforme.





\chapter{Bootloader}
Il bootloader e' un software con il compito di caricare il kernel del sistema nella memoria centrale e 
di mandarlo in esecuzione.
Non essendo il bootloader lo scopo del progetto, ho deciso di utilizzarne uno gia' esistente, e la mia
scelta e' ricaduta su grub. 

\section{Grub}
Grub e' uno dei bootloader piu' utilizzati nell'ambito Linux e *BSD.
Grazie alla sua flessibilita', e' possibile utilizzarlo su molteplici dispositivi (floppy, cd, usb), 
e con molteplici opzioni, semplicemente modificando un file di configurazione per dare le direttive 
su che sistema caricare.

\addcontentsline{toc}{subsection}{Vesa Bios Extension}
\subsubsection{Vesa Bios Extension}
Con l'utilizzo di una patch chiamata "vbegrub", grub introduce delle funzioni che permettono di
impostare una risoluzione grafica del vbe e successivamente caricare il sistema. Questa patch
e' stata utile in SpiderpigOS in quanto ha permesso di implementare una semplice gui, senza dover
scrivere un driver per la grafica vesa, o senza dover creare un processo per l'emulazione della 
modalita' reale, che quindi permetteva di utilizzare gli interrupt e cambiare modalita' grafica.







\chapter{Kernel}
Il "kernel" e' il primo livello del sistema vero e proprio, e si occupa di offrire dei servizi all'utente,
e in genere, di gestire la memoria, i task, i file system, lo stack per il networking, etc, ma le funzioni 
del kernel variano considerevolmente a seconda del modello di kernel.

\section{Modello di kernel}
Uno dei primi problemi all'avvio della realizzazione di SpiderpigOS, e'
stata la scelta del modello di kernel da utilizzare; come sappiamo, i modelli
piu' usati sono il micro kernel e il kernel monolitico:


\addcontentsline{toc}{subsection}{Kernel Monolitico}
\subsubsection{Kernel Monolitico}
Kernel contenente al suo interno la maggior parte delle features implementate nel sistema.
L'inconveniente e' che se e' presente un errore al suo interno, compromette il funzionamento
dell'intero sistema. La mia scelta e' ricaduta sul kernel monolitico, in quanto presenta minori problematiche strutturali
rispetto ad un kernel ibrido o ad un microkernel.



\addcontentsline{toc}{subsection}{Microkernel}
\subsubsection{Microkernel}
Kernel con funzionalita' molto ridotte, in genere offre solo un interfaccia base per l'hardware,
e le funzionalita' come filesystem, audio, network sono offerte da dei server avviati a livello utente.
Il lato positivo di questo modello di kernel e' che se una parte del sistema crasha (filesystem, audio o altro)
puo' essere riavviata senza compromettere il funzionamento dell'intero sistema.



\addcontentsline{toc}{subsection}{Kernel Ibrido}
\subsubsection{Kernel Ibrido}
E' una via di mezzo tra microkernel e kernel monolitco: in genere il kernel offre un interfaccia per
l'hardware e il livello utente, gestione di task, filesystem, etc, mentre a livello utente i server 
offrono ai programmi le varie funzionalita' del sistema.



\section{Compilazione}
Il sistema di compilazione ha un interfaccia in python che permette di scegliere i componenti
da compilare nel kernel; i componenti sono registrati nello stesso file python in una struttura
contenente le dipendenze, i define da dichiarare, i file oggetto da creare, etc; il programma
inoltre permette di scegliere l'architettura da compilare e la lingua per l'output del kernel. 
E' inoltra possibile utilizzare dei preset di configurazione presalvati o gia' disponibili con i sorgenti.
Il programma e' avviabile tramite il commando seguente, eseguito nella cartella "src/kernel":

\begin{center}
\texttt{python kselect.py}
\end{center}

KSelect produce il file include/config.h contenente tutti i define dei contenuti compilati, 
e config/current.am contenente le opzioni di compilazione e la lista dei file oggetto. Dopododiche'
e' possibile compilare il kernel eseguendo un make nella cartella "src/kernel":

\begin{center}
\texttt{make}
\end{center}

Make produrra' un file binario "kernel", che sara' possibile copiare e utilizzare come kernel facendolo
caricare da un qualsiasi bootloader, oppure flasharlo in un dispositivo supportato come firmware.


\section{Astrazione hardware}
Nel kernel e' presente un sistema che permette di implementare diverse architetture senza apportare grandi
modifiche al sistema. Ogni architettura dovra' offrire delle funzioni stabilite nell'header arch.h; se 
alcune funzioni non e' possibile implementarle, bisogna comunque sviluppare delle funzioni vuote. E'
inoltre disponibile per ogni architettura una costante che permettera' di definire delle eccezzioni e delle
condizioni in fase di compilazione nel codice per i vari driver e le parti del sistema.



\section{Gestore della memoria}
SpiderpigOS divide la memoria del computer in pagine da 4kb (e' possibile modificare questo valore), e tiene
traccia delle pagine occupate, tramite un sistema costituito da una mappa di bit; per registrare la dimensione 
delle allocazioni effettuate, e' presente poi una lista che memorizza indirizzo base e numero di byte allocati,
per permettere in futuro di liberare la memoria. 
Successivamente sara' implementata la paginazione hardware per le architetture che la supportano,
per migliorare la protezione della memoria tra i vari processi.

\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c | }
	    \hline
	    malloc, free    \\ \hline   
	    Gestore paginzione hardware  \\ \hline
	    Gestore Fisico   \\ \hline
	    \end{tabular}
	\end{center}
	\caption{Livelli del gestore della memoria}
	\label{tab:mm_levels}
\end{table}




\section{Tasking}
SpiderpigOS e' un sistema multitasking; ad ogni task durante la creazione, viene allocata una struttura con
tutte le informazioni necessarie, che poi verra' inserita in una lista. Per lo switching, durante
l'inizializzazione del tasking e' possibile scegliere la funzione che eseguira' il task switching, per 
ora e' implementato solo il round robin. 


\section{Driver}
L'implementazione dei driver\footnote{interfaccia tra hardware e software} e' una delle problematiche 
principali nello sviluppo di un sistema: in SpiderpigOS e' presente una struttura di driver generico, che
contiene al suo interno una variabile che ne indica il tipo; a seconda del tipo viene allocata la struttura
specifica che contiene i metodi generici di quel tipo. Tramite questo metodo e' possibile quindi 
implementare filesystem, device driver, e altri contenuti del sistema.

Elenchiamo ora i tipi di driver che e' possibile implementare in spiderpig:
\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c | c |}
	    \hline
	    File System & Permette di gestire un nuovo filesystem  \\ \hline
	    Device driver & Offre delle primitive per gestire un determinato driver \\ \hline
	    \end{tabular}
	\end{center}
	\caption{Tipi di driver}
	\label{tab:fs_levels}
\end{table}


\section{File System}
SpiderpigOS presenta una struttura a livelli per quanto riguarda le operazioni su file. Il livello
piu' alto e' il VFS\footnote{Virtual File System}, l'unico livello accessibile all'utente che offre
tutte le funzioni tipiche della gestione file e filesystem (apertura, lettura, chiusura, scrittura, 
mounting, umounting, etc) indipendentemente dal filesystem e dall'hardware che viene utilizzato. 

\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c |}
	    \hline
	    VFS    \\ \hline
	    File System   \\ \hline
	    Device driver   \\ \hline
	    Device   \\ \hline
	    \end{tabular}
	\end{center}
	\caption{Livelli per le operazioni sui fs}
	\label{tab:fs_levels}
\end{table}

Il VFS e' una struttura di nodi ad albero. 

\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c | c |}
	    \hline
	    Attributo & Spiegazione     \\ \hline
	    Nome & Nome del nodo (univoco in directory)    \\ \hline
	    Numero & Numero del nodo (univoco nell'albero) \\ \hline
	    Tipo & Tipo di nodo (device, link, dir, file) \\ \hline
		 Ow & Indica se il nodo e' temporaneo \\ \hline
		 Next, Prev & Puntatori a prossimo e precedente nodo \\ \hline
		 Parent, Childs & Puntatori a padre e figli del nodo \\ \hline
	    \end{tabular}
	\end{center}
	\caption{Struttura di un nodo}
	\label{tab:fs_node}
\end{table}

Quando viene richiesto un determinato path, il VFS guarda la strada che deve effettuare
per arrivare al path se e' raggiungibile, e alloca dei nodi temporanei per custodire le informazioni
necessarie. 

\subsection{DevFS}
E' fondamentalmente un filesystem virtuale che permette ai device a cui e' assocciato un driver, di essere
trattati come gli altri file. Le informazioni dei device e dei driver risiedono in dei nodi allocati
nella struttura principale del vfs, che possono essere eliminati solamente nel caso il device non sia 
piu' disponibile; i programmi di interfacciamento utilizzeranno questi file per utilizzare 
l'hardware a livello utente.


\subsection{PigFS}
Come primo filesystem vero e proprio supportato e' stato deciso di implementarne uno progettato apposta per
questo sistema, strutturato in questo modo

\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c |}
	    \hline
		 Super Blocco (512 byte)\\ \hline
		 Blocchi node \\ \hline
		 Blocchi dati \\ \hline
	    \end{tabular}
	\end{center}
	\caption{Struttura PFS}
	\label{tab:pfs_struct}
\end{table}



\section{Networking}
L'interfaccia di rete e' ancora in fase di progettazione su carta.

\section{Audio}

\chapter{Prestazioni}
In questo capitolo trattero' le prestazioni del sistema in esecuzione, effettuando dei confronti con altri
sistemi operativi. Prima di tutto propongo una tabella coi limiti del sistema: 

\begin{table}[h]
	\begin{center}
	    \begin{tabular}{ | c | c | }
	    \hline
	    Caratteristica & Quantita' \\ \hline
	    File aperti & 32.000  \\ \hline
	    FS montati in contemporanea & 0 \\ \hline
	    Task in esecuzione & 0   \\ \hline
	    Numero massimo allocazioni & 4096 \\ \hline
	    Driver caricati & 0  \\ \hline	    
	    \end{tabular}
	\end{center}
	\caption{Prestazioni generiche}
	\label{tab:generic_benchmarks}
\end{table}




\addcontentsline{toc}{chapter}{Bibliografia}
%\chapter{Bibliografia}
\begin{thebibliography}{Bibliografia}
	\bibitem{lamport-latex2} Intel Manuals
	\bibitem{lamport-latex2} http://www.osdev.it
	\bibitem{lamport-latex2} http://wiki.unix-below.net/doku.php?id=osdev
	\bibitem{lamport-latex2} http://www.osdev.org 
\end{thebibliography}

\appendix


\end{document}

